package com.jt.service;

import com.jt.vo.ImageVO;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
@Component
@PropertySource("classpath:/image.properties")//读取properties文件，为@value获取值提供支持
public class FileServiceImpl implements FileService{
    /**步骤
     * 1.获取文件名，并将文件名转小写规避BUG
     * 2.为了确认文件上传的是图片，使用正则式进行第一不判断，确认是图片的文件格式 "^.+\\.(jpg|png|gif)$"
     * 3.防止木马文件，使用API工具ImageIO的read方法读取输入流获取图片文件固有的属性，对属性进行二次判断
     * 4.为了提高查询效率，将文件分目录查询，在本类封装一个固定存储路径属性，作为成员变量，并且
     *   准备动态的文件路径，对图片进行分目录管理，使用日期的方式创建文件夹
     * 5.拼接固定路径和动态路径
     * 6.对拼接好的存储路径进行判断，若不存在，就新建
     * 7.为避免文件名重复，使用UUID自动生成替换文件名
     * 8.根据 文件.×××，使用String的API工具lastIndexOf获取最后一个.的下标
     *   根据这个下标，substring截取字符串，获得文件的格式 .×××
     * 9.将UUID和文件格式拼接成一个字符串，这个字符串就是图片的新文件名
     * 10.将文件存储的完整路径和文件名拼接获取文件完整路径
     * 11.transferTo上传文件
     * 12.文件的虚拟地址就是动态路径+新文件名
     * 13.封装ImageVO的虚拟地址virtualPath，网络访问地址，文件名并返回
     *
     * 一.后台数据优化，封装变量通过@Value注解给变量动态赋值和通过手动编辑properties文件获取值
     */
    @Value("${image.locdir}")
    private String locdir;
    @Value("${image.preUrl}")
    private String preUrl;
    @Override
    @Transactional
    public ImageVO upload(MultipartFile file) {
        String filename = file.getOriginalFilename();
        filename = filename.toLowerCase();
        System.out.println("获取的文件名为"+filename);

        if (!filename.matches("^.+\\.(jpg|png|gif)$"))return null;
        try {
            BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
            int height = bufferedImage.getHeight();
            int width = bufferedImage.getWidth();
            if (width==0||height==0)return null;

            String datedir = new SimpleDateFormat("/yyyy/MM/dd/").format(new Date());
            System.out.println("磁盘路径为"+locdir);
            System.out.println("时间格式的动态路径为"+datedir);
            String locDateDir = locdir+datedir;
            System.out.println("图片存储的完成路径为："+locDateDir);
            File dir = new File(locDateDir);
            if (!dir.exists())dir.mkdirs();

            String uuid = UUID.randomUUID().toString().replace("-","");
            System.out.println("生成的uuid为"+uuid);
            int index = filename.lastIndexOf(".");
            String jpg = filename.substring(index);
            System.out.println("截取的文件后缀名为"+jpg);
            String newFileName = uuid+jpg;
            System.out.println("拼接的新文件名为："+newFileName);
            String localPath = locDateDir+newFileName;
            System.out.println("那么，图片上传的完整路径是："+localPath);
            file.transferTo(new File(localPath));

            String virtualPath = datedir+newFileName;
            System.out.println("返回的图片虚拟路径为："+virtualPath);
            String url =preUrl+virtualPath ;
            System.out.println("返回的图片url为："+url);
            return new ImageVO(virtualPath, url, newFileName);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    @Override
    @Transactional
    public void deleteFile(String virtualPath) {
        String[] virtualPathArr = virtualPath.split(",");
        for(String virtual:virtualPathArr){
            String localDirPath = locdir+virtual;
            File file = new File(localDirPath);
            if (file.exists()){
                System.out.println("图片"+virtual+"删除成功！");
                file.delete();
            }
        }
    }

}

